package com.doit.day01;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.List;

public class TestDemon {
    public static void main(String[] args) throws Exception {
        /**
         * 第一个参数：zk的连接地址
         * 第二个参数：连接的超时时间，单位ms
         * 第三个参数：监听器
         */
        String conn = "linux01:2181";
        int timeOut = 2000;
        ZooKeeper zk = new ZooKeeper(conn, timeOut, null);

        //获取路径下面的子节点
/*
        List<String> children = zk.getChildren("/", null);

        for (String child : children) {
            System.out.println("/目录下面的子节点是:"+child);
        }
*/

        //创建节点
        /**
         * 第一个参数：创建节点的路径
         * 第二个参数：创建节点的值，这个值是byte数组
         * 第三个参数：访问的权限
         *      OPEN_ACL_UNSAFE：完全开放的权限，具有所有的权限
         *      CREATOR_ALL_ACL：创建这的所有权限，root 有所有的权限，hongliu：如果你只有只读权限
         *      READ_ACL_UNSAFE：只有读取的权限，不能修改
         *
         * 第四个参数：创建节点的类型 -e创建临时节点  -s创建一个有序的节点
         *      PERSISTENT:永久的  ==》 默认就是永久的 =》 不加任何参数
         *      PERSISTENT_SEQUENTIAL:永久有序的 ==》 -s
         *      EPHEMERAL:临时的  -e
         *      EPHEMERAL_SEQUENTIAL:临时有序的  -e -s
         * 返回值：返回的是创建的路径
         */
        /*String path = zk.create("/teacher", "xiaotao".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        System.out.println(path);*/


        /**
         * 第一个参数：需要删除节点的路径
         * 第二个参数：需要删除节点的版本号，-1(代表的是所有的版本)
         * 如果现在版本是1，但是你参数写了一个4，他就会抛异常，版本号异常
         */
//        zk.delete("/teacher",4);


        //递归删除节点   删除的节点必须得是空节点   rmr
//        rmr(zk,"/teacher");


        byte[] data = zk.getData("/teacher", null, null);
        String res = new String(data);
        System.out.println(res);


    }


    public static void rmr(ZooKeeper zk,String path) throws Exception {
        //首先我们要遍历这个节点，看这个节点下面是不是还有节点，如果还有，需要在往里面不断的挖呀挖
        List<String> children = zk.getChildren(path, null);
        //这个children集合是我现在给的path下面的下一层节点
        //如果他是null的话，或者说这个list集合长度为0，代表到了最底层把
        if (children != null && children.size() >0){
            for (String child : children) {
                rmr(zk,child);
                System.out.println("现在正在删除的节点是："+path+"/"+child);
            }
        }
        zk.delete(path,-1);
    }



}
